計算論的臨床心理学サマースクール2025
2025-08-07
大水拓海(おおみず たくみ)
専修大学大学院文学研究科心理学専攻修士課程2年
心理療法の作用機序,感情粒度,心理ネットワーク,
シミュレーション,能動的推論
なぜネットワークからシミュレーションを行うか?
実際の臨床データを使用することの困難さ(入手や使用)
侵襲性の問題を超えて介入を試す,予測する
新たな仮説の生成
DSM-III-TRに基づく大うつ病の横断データ(8973名)から症状ネットワークが推定されている
ネットワークの結合を強めるパラメータ\(c\)の値が症状全体の活性化を左右する(Cramer et al, 2016)
\[A^{t}_{i} = \sum^{J}_{j=1} cW_{ij}X^{t-1}_j\tag{1}\]
\[P(X^{t}_{i} = 1) = \frac{1}{1+e^{b_{i}}-A^{t}_i} \tag{2}\]
Cramerのモデルでは症状のみの接続の強さに着目
実データにおいて症状が改善しても接続が強まっていることが報告(Höller et al, 2022)
→心理療法などの治療的な要素を入れて拡張することで,ネットワークの中でどの症状を標的にすれば大きな治療効果が得られるかシミュレーションできる
シミュレーションを実際に行ってみる
ネットワークシミュレーションを実行する関数を
パッケージにしてまとめました
ご自身のRコンソールに以下をコピペして,パッケージをインストールしてください
W_init:第1引数。症状ネットワークの重み。
b_init:第2引数。各ノードの活性化閾値。
target:第3引数。どのノードを標的とするかを選択する。介入するノードは1,介入しないノードは0にする。
上記は必須の引数です。
他にもいろいろオプションがあります。
仮想データの作成
# Example data for a 6-symptom network
set.seed(456)
weight_6 <- matrix(rnorm(6*6, mean = 0.2, sd = 0.08), nrow = 6, ncol = 6)
diag(weight_6) <- 0
weight_6[upper.tri(weight_6)] <- t(weight_6)[upper.tri(weight_6)]
print(weight_6) [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0.00000000 0.2497420 0.2640700 0.08888861 0.14285145 0.1740751
[2,] 0.24974204 0.0000000 0.2805882 0.24585877 0.12673516 0.3048878
[3,] 0.26406997 0.2805882 0.0000000 0.35578851 0.33895489 0.2309987
[4,] 0.08888861 0.2458588 0.3557885 0.00000000 0.08585358 0.2166589
[5,] 0.14285145 0.1267352 0.3389549 0.08585358 0.00000000 0.1128498
[6,] 0.17407512 0.3048878 0.2309987 0.21665887 0.11284977 0.0000000
threshold
1 0.2669698
2 0.2929874
3 0.2788010
4 0.2980632
5 0.2985529
6 0.3196519
ターゲットとノード名の設定
シミュレーションの実行
# Run the simulation with custom parameters
sim_results <- simulate_treatment_network(
W_init = weight_6, #重み
b_init = threshold_6$threshold, #閾値
target = target_list_6, #ターゲット
connectivity = 1.2, #全体的な接続の強さ
edge_between_TC = 1, #TCノード間の接続の強さ
weight_bias = 1, #症状とTCノードの重みの強さ
TB = 1, #閾値の値の高さ
trial = 10, # 繰り返し回数(複数回行って平均を取っている)
baseline_iteration = 10, # ベースラインのステップ数
num_TC = 5, # TCノードの数
TC_iteration_per_component = 10, # 何ステップごとにTCを追加するか
follow_up_iteration = 10, # TCを全て追加した後のフォローアップ期間
symptom_name = custom_symptom_names_6
)シミュレーション結果
Jordan et al(2017)のオープンデータからPHQ-9を使用します
# Isingのデータを使ってシミュレーションする
library(tidyverse)
library(foreign)
library(bootnet)
library(qgraph)
library(IsingFit)
# データの読み込み
data <- read.spss("data/pone.0182162.s004.sav",
to.data.frame=TRUE)
# データの整理(PHQ-9に絞って実行)
data_phq <- data %>%
mutate(phq9a = S_PHQ9_a, phq9b = S_PHQ9_b,
phq9c = S_PHQ9_c, phq9d = S_PHQ9_d,
phq9e = S_PHQ9_e, phq9f = S_PHQ9_f,
phq9g = S_PHQ9_g, phq9h = S_PHQ9_h,
phq9i = S_PHQ9_i) %>%
select(phq9a, phq9b, phq9c, phq9d, phq9e, phq9f, phq9g, phq9h, phq9i) %>%
binarize(split = 1)res <- IsingFit(data_phq, family = "binomial", AND = TRUE, gamma = 0.25, plot
= TRUE, progressbar = TRUE, min_sum = -Inf,
lowerbound.lambda = NA)
|
| | 0%
|
|======== | 11%
|
|================ | 22%
|
|======================= | 33%
|
|=============================== | 44%
|
|======================================= | 56%
|
|=============================================== | 67%
|
|====================================================== | 78%
|
|============================================================== | 89%
|
|======================================================================| 100%
重み
phq9a phq9b phq9c phq9d phq9e phq9f phq9g
phq9a 0.0000000 1.3512233 0.3825356 0.8660206 0.6654505 0.4623484 0.4960907
phq9b 1.3512233 0.0000000 0.3867215 1.2137379 0.3584718 1.1976485 0.4538108
phq9c 0.3825356 0.3867215 0.0000000 1.1378644 0.3317111 0.0000000 0.4446904
phq9d 0.8660206 1.2137379 1.1378644 0.0000000 0.8244176 0.3485497 0.7074686
phq9e 0.6654505 0.3584718 0.3317111 0.8244176 0.0000000 0.6119471 0.4687336
phq9f 0.4623484 1.1976485 0.0000000 0.3485497 0.6119471 0.0000000 0.8234036
phq9g 0.4960907 0.4538108 0.4446904 0.7074686 0.4687336 0.8234036 0.0000000
phq9h 0.2331879 0.4098064 0.2051685 0.1764577 0.7436476 0.4007217 1.2111021
phq9i 0.5651184 1.4611687 0.4457955 0.0000000 0.3171910 1.2929490 0.2601279
phq9h phq9i
phq9a 0.2331879 0.5651184
phq9b 0.4098064 1.4611687
phq9c 0.2051685 0.4457955
phq9d 0.1764577 0.0000000
phq9e 0.7436476 0.3171910
phq9f 0.4007217 1.2929490
phq9g 1.2111021 0.2601279
phq9h 0.0000000 0.4314356
phq9i 0.4314356 0.0000000
閾値
phq9a phq9b phq9c phq9d phq9e phq9f phq9g
-2.0108238 -3.3807170 -0.8327044 -1.1721562 -2.2124596 -2.9561829 -2.4153062
phq9h phq9i
-3.4089789 -4.6697303
一つ目の症状ノードを標的にした介入
$result_plot
TableGrob (1 x 2) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (1-1,2-2) arrange gtable[layout]
$result_text
[1] "The mean value of symptom at the final step(t=120). = 0.578\nThe mean value of treatment component at the final step(t=120). = 0.600\nThe SD value of symptom at the final step(t=120). = 0.395\nThe SD value of treatment component at the final step(t=120). = 0.429"
PHQ-9の症状ネットワークや,関心のあるテーマから推定したネットワークを対象にして,ネットワークシミュレーションを行ってみましょう!
単独もしくは複数の症状を標的とした場合,どの症状への介入が最も効果的か?
症状を悪化させてしまう組み合わせはあるか?
その他,どんな条件だとどんなことが起きそうか?